package Datas_Structure.LianBiao;

public class Node {
    //结点值
    int data;
    //下一节点
    Node next;     // Node next = this; 双向循环链表

    public Node(int data) {
        this.data = data;
    }

    /**添加节点*/
    public Node appendNode(Node node) {
        //当前节点
        Node currentNode = this;
      /*
      //方式一：
      //循环向后找
        while (true) {
            //取出下一个节点
            Node nextNode = currentNode.next;
            //如果下一个节点为null，当前节点就是最后一个
            if (nextNode == null){
                break;
            }
            //下一个节点赋给当前节点
            currentNode = nextNode;
        }
        currentNode.next = node;*/

        //方式二：
        if (currentNode.next == null) {
            currentNode.next = node;
            return currentNode;
        } else {
            currentNode.next.appendNode(node);
        }
        return currentNode;
    }

    /**获取下一个节点*/
    public Node next() {
        return this.next;
    }

    /**获取当前节点的值*/
    public int getData() {
        return this.data;
    }

    /**判断是节点为空*/
    public Boolean isEmpty() {
        return this.next == null;
    }

    /**删除下一个节点*/
    public void removeNext() {
        //获取下下个节点
        Node newNext = this.next.next;
        //赋值给当前节点的下一个节点
        this.next = newNext;
    }
    /**获取所有节点的信息*/
    public void getAll() {
        //获取当前节点
        Node currentNode = this;
        while (true) {
            //打印当前节点的信息
            System.out.print(currentNode.data + " ");
            //把下一个节点赋给当前节点
            currentNode = currentNode.next;
            //判断节点是否为空
            if (currentNode == null) {
                break;
            }
        }
        System.out.println();
    }
    /**插入一个节点*/
    public void insertNode(Node node){
        //获取当前节点的下一个节点
        Node nextNext = this.next;
        //把插入的节点加在当前节点的后边
        this.next = node;
        //把nextNext放在新节点的后边
        node.next = nextNext;
    }

}

class NodeTest {
    public static void main(String[] args) {
        Node node = new Node(1);
        Node node1 = new Node(2);
        Node node2 = new Node(3);
        node.appendNode(node1).appendNode(node2).appendNode(new Node(4));
        /*
        System.out.println(node.getData());
        System.out.println(node.next.next.getData());
        System.out.println(node.next.next.isEmpty());
        */
        //插入一个节点
        node.insertNode(new Node(5));
        //打印
        node.getAll();
        //删除下一个节点
        node.removeNext();
        //打印所有节点的信息
        node.getAll();

    }
}
